package com.heatup.apt.api.service;

import com.baomidou.framework.service.ISuperService;
import com.heatup.apt.model.api.ApiResultModel;
import com.heatup.apt.model.user.UserInfo;

import java.text.ParseException;
import java.util.Date;
import java.util.Map;

/**
 *
 */
public interface UserService extends ISuperService<UserInfo> {

    UserInfo getUserInfoById(int id);

    Map<String, Object> getVipInfoById(int id, int productId, String longitudeLatitude);

    UserInfo wechatLogin(String openid, String nickname, String headimg, String sex);

    UserInfo wechatLogin(String openid, String nickname, String headimg, String sex, String inviter_userid, String activeId);

    Date getVipEndDate(int userId);

    Date getNextVipStartDate(int userId);

    /**
     * 更新用户等级
     *
     * @param userId
     * @return 返回最新等级
     */
    int updateUserLevel(int userId);

    /**
     * 更新手机号
     *
     * @param mobile
     */
    void updateMobile(Integer userId, String mobile);

    /**
     * 更新用户所有表中的手机号为新手机号
     *
     * @param userId 用户ID
     * @param mobile 新手机号
     * @author blank 2017/8/18 下午4:49
     */
    void syncUserAllMobile(Integer userId, String mobile);


    /**
     * 根据手机号获取用户
     *
     * @param mobile
     * @return
     */
    UserInfo getUserByMobile(String mobile);

    /**
     * 查询预售会员
     *
     * @return
     */
    UserInfo updatePresellUser(Map<String, Object> map);

    boolean judgeUserInfoIfPresellVip(UserInfo user);

    /**
     * 根据openid 返回用户信息
     */
    UserInfo getUserInfoByOpenId(String openId);

    //增加用户的vip天数，从当天开始算起
    Map<String, Object> addUserVipDayNum(int userId, int dayNum);

    int updateUserInfo(UserInfo userInfo);

    UserInfo queryUserInfoFromRedis(String openId);

    //判断用户是否已关注过我们公众号： 1:已关注。0: 未关注。
    Integer isSubScribe(String userid);

    /**
     * 判断邀请好友活动中判断是否是新用户
     * 判断逻辑：
     * 1.未在平台中购买过课程产品
     * 2.未领取过activityId该活动的优惠券
     *
     * @param openId
     * @param activityId
     * @return
     */
    Map<String, Object> isNewCustomOrInsert(String openId, UserInfo userInfo, Integer activityId, UserInfo shareUserInfo);

    /**
     * 获取临时二维码
     *
     * @param openId
     * @param activityId
     * @return
     */
    Map<String, Object> getQRSceneImgUrl(Integer userId, Integer activityId);
    
    /**
     * 检验用户是否为黑名单用户
     * @param userId
     * @return
     */
    boolean checkUserIsBlacklistUser(Integer userId);
    
    /**
     * 获取用户信息二维码
     * @param userId
     * @param activityId
     * @return
     */
    Map<String, Object> getUserDataQRCode(Integer userId , String QRCodeType);
    
    /**
     * 获取用户基本信息
     * 和用户餐券信息
     * @param userId
     * @return
     */
    Map<String, Object> getUserInfoAndUserMealData(Integer userId,  UserInfo adminUserInfo , String QRCodeType) throws ParseException;
    
    /**
     * 判断用户是否有餐饮权限
     * @param userInfo
     * @return
     */
    boolean checkUserHasMealRole(UserInfo userInfo);
    
    /**
     * 修改用户的手机
     * @param userId
     * @param code
     * @param syscode
     * @param lastSendTime
     * @param mobile
     * @param nickName
     * @return
     */
    Map<String,Object> userUpdateMobile(Integer userId, String code, Object sysCode ,Object lastSend, String mobile, String nickName);
    
    /**
     * 查询用户权限
     * @param userInfo
     * @return
     */
    Map<String,Object> querySysUserRoleList(UserInfo userInfo);
    
    boolean bindingPresaleTeam(UserInfo userInfo);

    /**
     * 查询用户对应的进门二维码
     *
     * @param userInfo 当前用户
     * @return 返回数据
     * @author blank
     * @since 2018/7/17 下午3:00
     */
    ApiResultModel enterQRCode(UserInfo userInfo);

    /**
     * @Author: timo
     * @Date: 2018/11/6 20:21
     * @Description: 更改用户真实姓名
     * operateType 为 2 的时候这里只能是会籍或者是教练才能修改
     * @param userId 被更改的用户ID
     * @param userName 被更改的用户真实姓名
     * @param userInfo 操作的用户
     * @param operateType 1 自己更新 不需要做权限校验 2 他人更新 需要做权限校验
     * @return
     */
    ApiResultModel updateUserName(Integer userId, String userName, UserInfo userInfo, Integer operateType);
}
